package com.taiyuan.zfmvp.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.List;

import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.io.inputstream.ZipInputStream;
import net.lingala.zip4j.model.FileHeader;

/**
 * @param
 * @Author: zhoufang@sxjtjt.net
 * @Descriiption:
 * @Date 2023/9/7
 * @return
 */
public class testZip {
    public static void main(String[] args) throws Exception {
        String zipFilePath = "C:\\Users\\86186\\Desktop\\物贸物流\\压缩包\\上传图片.zip";
        readZip(zipFilePath);


    }


    public static void readZip(String fileName) throws Exception {

        fileName.replaceAll("\\\\", "/");
        ZipFile zFile = new ZipFile(fileName);
        // 此处最好立即设置字符集
        zFile.setCharset(Charset.forName("GBK"));
        if (!zFile.isValidZipFile()) {
            return ;
        }
        File file = new File(fileName);
        File temp = file;

        String parentZipParent = temp.getParent();//获取上级文件夹解压到这里

        // 获取ZIP中所有文件的FileHeader，以便后面对zip中文件进行遍历
        List<FileHeader> list = zFile.getFileHeaders();
        // 此时list的size包括：文件夹、子文件夹、文件的个数
        System.out.println(list.size());
        // 遍历其中的文件
        for (FileHeader fileHeader : list) {
            String fileNameNew = fileHeader.getFileName();
            // fileName会将目录单独读出来，而且带有路径分割符
            if (fileNameNew.endsWith("/") || fileNameNew.endsWith("\\\\") || fileNameNew.endsWith("\\")) {
                System.out.println(fileNameNew + " 这是一个文件夹。");
                continue;
            }else {
                ZipInputStream inputStream = zFile.getInputStream(fileHeader);
                //String Md5String = BigFileMD5.getStreamMD5(inputStream);
                System.out.println(fileNameNew + " 这是一个文件" );
                temp = new File(parentZipParent + "\\" + fileNameNew);
                OutputStream os = new FileOutputStream(temp);
                //通过ZipFile的getInputStream方法拿到具体的ZipEntry的输入流
                int len = 0;
                while ((len = inputStream.read()) !=-1) {
                    os.write(len);
                }
            }
        }
    }


}
